package model

import (
	"time"

	"7qule.com/sd3/CrossServer/src/common/systemConstant"
	"public.com/goutil/syncUtil"
)

// 擂台比武信息表
type GlobalChallengeModel struct {
	// 玩家Id
	PlayerId string

	// 阶段
	StageId int

	// 排名
	Rank int

	// 是否是机器人
	IsRobot bool

	// --------------------------------辅助属性---------------------------------------------

	// 锁定玩家Id
	LockPlayerId string

	// 锁时间
	LockTime time.Time

	//数据锁
	timeLockObj *syncUtil.RWLocker
}

//
// NewGlobalChallenge
// @Description: 新建GlobalChallenge对象
// @return *GlobalChallengeModel:GlobalChallenge对象
//
func NewGlobalChallenge() *GlobalChallengeModel {
	newObj := &GlobalChallengeModel{}
	newObj.timeLockObj = syncUtil.NewRWLocker()
	return newObj
}

//
// NewGlobalChallenge2
// @Description: 新建GlobalChallenge2对象
// @return *GlobalChallengeModel:GlobalChallenge2对象
//
func NewGlobalChallenge2(playerId string, stageId, rank int) *GlobalChallengeModel {
	return &GlobalChallengeModel{
		PlayerId:    playerId,
		StageId:     stageId,
		Rank:        rank,
		timeLockObj: syncUtil.NewRWLocker(),
	}
}

//
// NewGlobalChallengeRobot
// @Description:新建机器人
// @param robotId:机器人id
// @param stageId:页签id
// @param rank:排名
// @return *GlobalChallengeModel:
//
func NewGlobalChallengeRobot(robotId string, stageId, rank int) *GlobalChallengeModel {
	return &GlobalChallengeModel{
		PlayerId:    robotId,
		StageId:     stageId,
		Rank:        rank,
		IsRobot:     true,
		timeLockObj: syncUtil.NewRWLocker(),
	}
}

//
// TryLock
// @Description:尝试锁定节点
// @receiver this
// @param newLockPlayerId:用户id
// @return bool:是否加锁成功
//
func (this *GlobalChallengeModel) TryLock(newLockPlayerId string) bool {
	if isOk, _, _ := this.timeLockObj.Lock(systemConstant.DefaultLockTime); isOk == false {
		return false
	}
	defer this.timeLockObj.Unlock()

	//如果当前位置的锁是玩家自己的 则更新锁的时间
	if this.LockPlayerId == newLockPlayerId {
		this.LockTime.Add(time.Minute * 5)
		return true
	}

	// 上一个锁未过期
	if this.LockTime.After(time.Now()) {
		return false
	}

	//锁不是该玩家的，但是锁过期了，把锁给新的玩家
	this.LockPlayerId = newLockPlayerId
	this.LockTime = time.Now().Add(time.Minute * 5)

	return true
}

//
// TryUnLock
// @Description:尝试解除节点锁定
// @receiver this
//
func (this *GlobalChallengeModel) TryUnLock() {
	//byron:此处不锁定是因为TryLock方法过滤掉了，走到该方法的是已经成功锁定的玩家，所以认为可以无条件释放

	this.LockPlayerId = ""
	this.LockTime = time.Now()
}
